﻿using Synergy.dbmodel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Synergy
{
    public partial class FormWgbg : Form
    {
        //1.声明自适应类实例  
        AutoSizeFormClass asc = new AutoSizeFormClass();
        string 物料编号;
        string 生产订单号;
        string 生产订单行号;
        string 加工顺序;
        string 工序编号;
        int 生产订单行ID;
        long 派工id;
        string 工票码;
        decimal 派工数量;
        decimal 已报工数量;
        string cUser_Id;
        public FormWgbg()
        {
            InitializeComponent();
        }

        private void FormWgbg_Load(object sender, EventArgs e)
        {
            this.Text += "-" + Application.ProductVersion;
            //asc.controlAutoSize(this);
            this.textBox工时单价.Visible = false;
            生产订单号 = "";
            生产订单行号 = "";
            加工顺序 = "";
            工序编号 = "";
        }

        private void textBoxTm_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                if (this.textBoxTm.Text.Trim() != "") 
                {
                    textBox不合格数量.Text = "0";
                    ListGxdata(this.textBoxTm.Text.Trim());
                    //查上一道工序及人员
                    查上一道工序及人员();
                }
            }
        }

        private void 查上一道工序及人员()
        {
            //查询这个订单的上一道工序
            int.TryParse(textBox加工顺序.Text, out int 加工顺序);
            string 前面的人信息 = "";
            if (加工顺序 > 10)
            {
                string 上一道工序 = (加工顺序 - 10).ToString().PadLeft(4, '0');

                string sql = $@"SELECT [id],[订单id],[订单号],[订单行id],[订单行号],[产品编号],[产品名称],[订单数量],[加工顺序],[工序编号],[工序名称],[cUser_Id],
                            [cUser_Name],[派工数量],[派工序号],[完工数量],[派工日期],[开工日期],[计划完工日期],[厂别],[发送日期],
                            [邮箱地址],[微信号],[工票码],[状态],[派工人],[发料人],[发料状态] FROM [Z_派工]  
                            WHERE (( [订单号] = '{textBox生产订单号.Text}' ) AND ( [订单行号] = '{textBox生产订单行号.Text}' )) AND ( [加工顺序] = '{上一道工序}' )";


                //string sql = $@"
                //    select 加工顺序,工序名称 from z_派工 
                //    where 1=1
                //    and 订单号 = '{textBox生产订单号.Text}' and 订单行号 = '{textBox生产订单行号.Text}'
                //     and not exists (select 1 from Z_baogong 
                //         where Z_baogong.工序名称 = z_派工.工序名称
                //         and 生产订单号 = '{textBox生产订单号.Text}' and 生产订单行号 = '{textBox生产订单行号.Text}'
                //          )
                //    order by 加工顺序
                //                ";
                System.Data.DataTable tb = pub.U8GetTable(sql);
                //List<Z_派工> z派工上一道工序 所有的cUser_Name，以逗号分开
                if (tb != null && tb.Rows.Count > 0)
                {
                    List<string> names = new List<string>();
                    for (int i = 0; i < tb.Rows.Count; i++)
                    {
                        //前面的人信息 += "["+tb.Rows[i]["加工顺序"].ToString() + (tb.Rows[i]["工序名称"].ToString() + "];");
                    }
                    前面的人信息 = $"上一道工序是[{tb.Rows[0]["加工顺序"].ToString()}],工序名称:{tb.Rows[0]["工序名称"].ToString()}, {string.Join(",", names.Distinct())}。 ";
                }
            }

            string sql2 = $@"select z_派工.加工顺序,z_派工.工序名称,sum(isnull(报工数量,0))报工数量
                        from z_派工 left join Z_baogong
                        on Z_baogong.生产订单号 = z_派工.订单号
                        and Z_baogong.生产订单行号 = z_派工.订单行号
                        and Z_baogong.加工顺序 = z_派工.加工顺序
                        where 订单号 = '{textBox生产订单号.Text}' and 订单行号 = '{textBox生产订单行号.Text}'
                        group by z_派工.加工顺序,z_派工.工序名称
                        order by  z_派工.加工顺序";
            System.Data.DataTable tb2 = pub.U8GetTable(sql2);
            dataGridView2.DataSource = tb2;
            dataGridView2.Refresh();
        }

        /// <summary>
        /// 显示工序的执行明细
        /// </summary>
        /// <param name="p"></param>
        private void ListGxdata(string tm)
        {
            //条码格式

            //生产订单号$生产订单行号$物料编号$数量$加工顺序$工序编号$工序名称
            //string 生产订单号;
            //string 生产订单行号;
            //string 物料编号;
            decimal 数量;
            //string 加工顺序;
            //string 工序编号;
            //if (tm.Split('$').Length <= 8)
            //{
            //    MessageBox.Show("该二维码或报工版本较老，请更新");
            //    return;
            //}
            //查工票
            if (工票是否存在(tm) == false)
            {
                MessageBox.Show("该二维码不存在");
                return;
            }
            else
            {
                textBoxUserId.Text = pub.LoginUser;
            }
            if (!pub.解析条码(tm, out 生产订单号, out 生产订单行号, out 物料编号, out 数量, out 加工顺序, out 工序编号))
            {
                MessageBox.Show("您扫描的条码没法解析，请重扫!", "提示", MessageBoxButtons.OK);
                this.textBoxTm.SelectAll();
                this.textBox生产订单号.Text = "";
                this.textBox生产订单行号.Text = "";
                this.textBox物料编号.Text = "";
                this.textBox加工顺序.Text = "";
                this.textBox工序编号.Text = "";
                this.textBox工序名称.Text = "";
                return;
            }
            //查询人员
            string sqlUser = "select cUser_Name from Z_UA_User where cUSER_Id='" + pub.LoginUser + "'";
            DataTable tb = pub.SysGetTable(sqlUser);
            if (tb != null && tb.Rows.Count > 0)
            {
                this.textBox姓名.Text = tb.Rows[0][0].ToString();
            }
           //string 新物料编号 = pub.根据老物流号获取新料号(生产订单号, 生产订单行号);
           // if (string.IsNullOrEmpty(新物料编号) == true)
           // {
           //     MessageBox.Show($"新账套中不存在老物料号{物料编号}对应的新物料号，无法报工");
           //     return;
           // }
           // else
           // {
           //     物料编号 = 新物料编号;
           // }
            //查询物料名称
            string sqlInvName = "select cInvName,cInvStd from Inventory where cInvCode = '" + 物料编号 + "'";
            DataTable tbInv = pub.U8GetTable(sqlInvName);
            if (tbInv != null && tbInv.Rows.Count > 0)
            {
                this.textBox物料名称.Text = tbInv.Rows[0][0].ToString();
                this.textBox规格.Text = tbInv.Rows[0][1].ToString();
            }
            //查询工序单价
            decimal 工序单价 = Get工序单价();
            textBox工序单价.Text = 工序单价.ToString();
            //查客户编码
            string sqlCusCode = $"select Define2 from mom_order where MoCode = '{生产订单号}'";
            DataTable tbCusCode = pub.U8GetTable(sqlCusCode);
            if (tbCusCode != null && tbCusCode.Rows.Count > 0)
            {
                this.textBox客户编码.Text = tbCusCode.Rows[0][0].ToString();
            }

            string sqlCheckFaLiao1 = @"select 状态 from z_派工 where 工票码 ='" + tm+"'";
            object 状态1 = SqlHelper.SqlHelper.ExecuteScalar(sqlCheckFaLiao1);
            if (状态1 == null)
            {
                MessageBox.Show("未查询到该工票信息。");
                return;
            }
            工票码 = tm;
            ///根据生产订单号，订单行号，工序顺序找到本工序已报数量，待检数量，合格数量，不良数量。上一工序的已报数量，待检数量，合格数量，不良数量。
            ///
            //如果是第一道工序，检查是否已经发料
            if (加工顺序 == "0010")
            {
                string sqlCheckFaLiao = @"select 状态 from z_派工 where  工票码 ='" + tm + "'";
                object 状态 = SqlHelper.SqlHelper.ExecuteScalar(sqlCheckFaLiao);
                if (状态 != null && (状态.ToString() == "已发料" || 状态.ToString() == "在产"))
                {

                }
                else
                {
                    MessageBox.Show("该工票尚未完成发料或已完工无法开工。", "提示", MessageBoxButtons.OK);
                    //暂时关闭
                    //return;
                }
            }
            //20240604 宋经理提出不要验证关闭
            //if (Is生产订单关闭())
            //{
            //    MessageBox.Show("您扫描的这个条码已经订单行关闭了，不能再次报工", "提示", MessageBoxButtons.OK);
            //    return;
            //}
            this.textBox生产订单号.Text = 生产订单号;
            this.textBox生产订单行号.Text = 生产订单行号;
            this.textBox物料编号.Text = 物料编号;
            this.textBox加工顺序.Text = 加工顺序;
            this.textBox工序编号.Text = 工序编号;

            this.textBox工序名称.Text = Get工序名称();
            //检查当前人员是否能报这个工序
            if (检查当前人员是否能报这个工序(this.textBox工序名称.Text) == false)
            {
                MessageBox.Show($"工号{pub.LoginUser}无权报{this.textBox工序名称.Text}工序，请联系主管设置");
                return;
            }
            this.textBox订单数量.Text = 数量.ToString("F0");
            派工数量 = 数量;
            this.textBox最大可报数量.Text = Get最大可报数量().ToString("F0");
            this.textBox本次报工数量.Text = Math.Abs(Get最大可报数量()).ToString("F0");
            this.textBox本次报工数量.Focus();
            this.textBox报工工时.Text = "";
            this.dateTimePicker开工时间.Value = DateTime.Now.AddDays(-0.5);
            this.dateTimePicker完工时间.Value = DateTime.Now;
            ///List该工单的改人员的报工记录
            List报工记录();

        }

        private bool 检查当前人员是否能报这个工序(string text)
        {
            return SqlSugarHelp.scope.Queryable<Z_人员工序>().Where(it => it.工序名称 == text && it.cUser_Id == pub.LoginUser).Any();
        }

        //查工票
        private bool 工票是否存在(string 工票码)
        {
            string sql = $"select 工票码 from z_派工 where 工票码 = '{工票码}'";
            DataTable tb = pub.U8GetTable(sql);
            if (tb != null && tb.Rows.Count > 0)
            {
               return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// 判断是否订单行关闭
        /// </summary>
        /// <returns></returns>
        private bool Is生产订单关闭()
        {
            string sql;
            sql = "select isnull(关闭人员,'') from View_生产订单明细 where 生产订单号='" + 生产订单号 + "' and 行号='" + 生产订单行号 + "'";
            DataTable tb = pub.U8GetTable(sql);
            if (tb != null)
            {
                if (tb.Rows.Count > 0)
                {
                    if (tb.Rows[0][0].ToString() == "")
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }

        private void List报工记录()
        {
            string sql;
            sql = @"  select id,生产订单号, 生产订单行号, 物料编号, 订单数量, 加工顺序, 工序编号, 工序名称, 报工数量, 工序单价, 
                开始时间, 结束时间, 报工工时, 工时单价, 金额, 报工人员, 报工时间, 是否工时结算,'' 是否已检验,是否已经计算,工票码
FROM      Z_baogong where 生产订单号='" + 生产订单号 + "' and 生产订单行号='" + 生产订单行号 + "' and 加工顺序='" + 加工顺序 + "'";
            sql += " and 报工人员='" + pub.LoginUser + "'";
            sql += " order by  id desc ";
            DataTable tb = pub.U8GetTable(sql);
            this.dataGridView1.AutoGenerateColumns = false;
            if (tb != null)
            {
                for (int i = 0; i < tb.Rows.Count; i++)
                {
                    tb.Rows[i]["是否已检验"] = pub.Get是否已检验(tb.Rows[i]["id"].ToString());
                }
            }
            this.dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
            this.dataGridView1.DataSource = tb;
            this.dataGridView1.Refresh();

        }

        private string Get工序名称()
        {
            string sql;
            sql = "select OpCode,Description from sfc_operation where OpCode='" + 工序编号 + "'";
            DataTable tb = pub.U8GetTable(sql);
            try
            {
                return tb.Rows[0]["Description"].ToString();
            }
            catch
            {
                return "";
            }

        }
        //最大可报数量是 派工数量-已经报工数量
        private decimal Get最大可报数量()
        {
            //查询这个员工这个工票已报工数量
            //string sql已报工数量 = @"select isnull(sum( 报工数量),0) from Z_baogong
            //                        where 工票码 = '" + 工票码 + "' ";
            string sql已报工数量 = $@"select isnull(sum( 报工数量),0) from Z_baogong
                            where 生产订单号 = '{生产订单号}' and 生产订单行号 = '{生产订单行号}' and 加工顺序 = '{加工顺序}'";
            string 已报数量str = SqlHelper.SqlHelper.ExecuteScalar(sql已报工数量).ToString();
            if (!decimal.TryParse(已报数量str, out 已报工数量))
            {
                MessageBox.Show("已报数量解析出错，请联系管理员");
                return 0;
            }


            ///先不控制合格不合格
            string sql;
            //最大可报数量为如果是首道工序，则不能超过订单数量。如果非首道工序则不能超过上道工序累计值（合格数量）
            sql = @" select isnull(max( 加工顺序  ),'') FROM      z_派工 ";
            sql += " where 订单号='" + 生产订单号 + "' and 订单行号='" + 生产订单行号
                + " ' and  convert(bigint,加工顺序)  <convert(bigint,'" + 加工顺序 + "')";
                    //+ "' and 加工顺序 <'" + 加工顺序 + "'";
            string 上道工序;
            decimal 上道工序数量 = 0;
            decimal 订单数量 = 0;
            DataTable tb1 = pub.U8GetTable(sql);
            if (tb1.Rows.Count > 0)
            {
                上道工序 = tb1.Rows[0][0].ToString();
                if (上道工序.Trim() != "")
                {
                    sql = " select isnull(sum( 报工数量),0) from Z_baogong where  生产订单号='" + 生产订单号 + "' and  生产订单行号 ='" + 生产订单行号 + "' and 加工顺序 ='" + 上道工序 + "'";
                    DataTable tb2 = pub.U8GetTable(sql);
                    if (tb2.Rows.Count > 0)
                    {
                        上道工序数量 = pub.ToDecimal(tb2.Rows[0][0].ToString());
                        ///本道工序累计完成了多少？含本道质检合格，以及未质检的。
                        ///所谓未质检的就是报工id未出现在质检表里面的。质检如果分多次检验的，则累计报工数=质检合格数+（累计报工数-（质检合格数+质检不良数））=累计报工数-质检不良数
                        //decimal 累计报工数 = 0;
                        //sql = "select isnull(sum( 报工数量),0) from Z_baogong where 生产订单号='" + 生产订单号 + "' and  生产订单行号 ='" + 生产订单行号 + "' and 加工顺序 ='" + 加工顺序 + "'";
                        //DataTable tb3 = pub.U8GetTable(sql);
                        //if (tb3.Rows.Count > 0)
                        //{
                        //    累计报工数 = pub.ToDecimal(tb3.Rows[0][0].ToString());
                        //}
                        if (上道工序数量 > 派工数量)
                        {
                            return 派工数量 - 已报工数量;
                        }
                        else
                        {
                            decimal a = 上道工序数量 - 已报工数量;
                            if (a < 0)
                            {
                                return 0;
                            }
                            else
                            {
                                return a;
                            }
                        }
                    }
                    else
                    {
                        return 0;
                    }
                }
                else
                {

                    return 派工数量 - 已报工数量;
                }
            }
            else
            {
                return 派工数量 - 已报工数量;
            }



        }



        private void button清空_Click(object sender, EventArgs e)
        {

            this.dataGridView1.DataSource = null;
            this.dataGridView1.Refresh();
            ClearAll();

        }

        private void ClearAll()
        {
            this.textBoxTm.Text = "";
            this.textBoxTm.Focus();
            this.textBox报工工时.Text = "";
            this.textBox本次报工数量.Text = "";
            this.textBox订单数量.Text = "";
            this.textBox工序编号.Text = "";
            this.textBox工序名称.Text = "";
            this.textBox加工顺序.Text = "";
            this.textBox生产订单行号.Text = "";
            this.textBox生产订单号.Text = "";
            this.textBox物料编号.Text = "";
            this.textBox最大可报数量.Text = "";
            this.checkBoxGongshi.Checked = false;
            this.textBox工时单价.Visible = false;
            生产订单号 = "";
            生产订单行号 = "";
            加工顺序 = "";
            工序编号 = "";
        }

        private void button报工_Click(object sender, EventArgs e)
        {
          
            ///先判断有没有超过最大可报数量
            decimal 本次报工数量;
            decimal 不合格数量;
            decimal 最大可报数量 = 0;
            decimal 累计报工数 = 0;
            decimal 订单总数量 = 0;
            string 不良原因 = "";
            if (string.IsNullOrEmpty(textBox本次报工数量.Text) == true)
            {
                textBox本次报工数量.Text = "0";
            }

            if (decimal.TryParse(this.textBox本次报工数量.Text,out 本次报工数量) == false)
            {
                MessageBox.Show("本次报工数量只能输入数字");
                return;
            }

            if (decimal.TryParse(this.textBox不合格数量.Text, out 不合格数量) == false)
            {
                MessageBox.Show("不合格数量只能输入数字");
                return;
            }
            if (不合格数量 > 本次报工数量)
            {
                MessageBox.Show("不合格数量不能大于本次报工");
                return;
            }
            if (本次报工数量 <= 0)
            {
                MessageBox.Show("报工数量不能小于等于0");
                return;
            }

            List<Z_报工不良原因> z_报工不良原因List = new List<Z_报工不良原因>();
            if (不合格数量 > 0)
            {
                Form选择不良原因分类 form = new Form选择不良原因分类(textBox工序名称.Text, 不合格数量);
                form.ShowDialog();
                if (form.DialogResult == DialogResult.OK)
                {
                    z_报工不良原因List = form.z_报工不良原因List;
                    不良原因 = string.Join(";",z_报工不良原因List.Select(x => x.不良原因名称+":"+x.数量).ToList());
                }
                else
                {
                    MessageBox.Show("不合格数量大于0，请选择不良原因");
                    return;
                }
            }

            //本次报工数量 = pub.ToDecimal(this.textBox本次报工数量.Text);
            //不合格数量 = pub.ToDecimal(this.textBox不合格数量.Text);
            最大可报数量 = Get最大可报数量();
            累计报工数 = Get累计报工数();
            订单总数量 = Get订单总数量();
            string 最大顺序号;
            this.textBox最大可报数量.Text = 最大可报数量.ToString();
            if (本次报工数量 > 最大可报数量)
            {
                MessageBox.Show("已经超过了该工序最大可报数量:" + 最大可报数量.ToString() + "了。", "提示", MessageBoxButtons.OK);
                return;
            }
            //if (本次报工数量 + 累计报工数 > 订单总数量)
            //{
            //    MessageBox.Show("已经超过了该生产订单最大需求数量:" + 最大可报数量.ToString() + "了。", "提示", MessageBoxButtons.OK);
            //    return;
            //}
            if (本次报工数量 == 0)
            {
                MessageBox.Show("本次报工数量不能为0", "提示", MessageBoxButtons.OK);
                return;
            }
            string sql;
            decimal.TryParse(textBox工序单价.Text.Trim(),out decimal 单价);
            decimal 工序单价 = 单价;
            if (this.textBox工序名称.Text == "校表" || this.textBox工序名称.Text == "焊接")
            {
                if (工序单价 <= 0)
                {
                    MessageBox.Show($"{this.textBox工序名称.Text}工序没有单价，请联系工艺工程师", "提示", MessageBoxButtons.OK);
                    return ;
                }
            }
            最大顺序号 = Get最大顺序号();
            sql = @"insert into z_baogong(生产订单号, 生产订单行号, 物料编号, 订单数量, 加工顺序, 工序编号, 工序名称, 报工数量,不合格数量, 工序单价, 
                开始时间, 结束时间, 报工工时, 工时单价, 金额, 报工人员, 报工时间,是否工时结算,是否已经计算,是否最大顺序,工票码,不良原因) OUTPUT INSERTED.id";
            sql += " values('" + this.textBox生产订单号.Text + "' ,'" + this.textBox生产订单行号.Text + "' ,'" + this.textBox物料编号.Text + "','" + this.textBox订单数量.Text + "','" + this.textBox加工顺序.Text + "',";
            sql += " '" + this.textBox工序编号.Text + "' ,'" + this.textBox工序名称.Text + "','" + 本次报工数量 + "','"+ 不合格数量 + "','" + 工序单价 + "',";
            sql += " '" + this.dateTimePicker开工时间.Value + "' ,'" + this.dateTimePicker完工时间.Value + "','" + pub.ToDecimal(this.textBox报工工时.Text) + "',";
            if (!this.checkBoxGongshi.Checked)
            {
                sql += " '" + pub.ToDecimal(this.textBox工时单价.Text) + "','" + 本次报工数量 * 工序单价 + "','" + pub.LoginUser + "',getdate(),";

            }
            else
            {
                sql += " '" + pub.ToDecimal(this.textBox工时单价.Text) + "','" + pub.ToDecimal(this.textBox工时单价.Text) * pub.ToDecimal(this.textBox报工工时.Text) + "','" + pub.LoginUser + "',getdate(),";
            }
            if (this.checkBoxGongshi.Checked)
            {
                if (pub.ToDecimal(this.textBox工时单价.Text) == 0 || pub.ToDecimal(this.textBox报工工时.Text) == 0)
                {
                    MessageBox.Show("按照工时结算时工时单价和报工工时不能为0", "提示", MessageBoxButtons.OK);
                    this.textBox工时单价.Focus();
                    return;
                }

                sql += " '按照工时结算','未结算',";
            }
            else
            {
                sql += " '不按照工时结算','未结算',";
            }
            if (最大顺序号 == 加工顺序)
            {
                sql += " '是最大顺序号',";
            }
            else
            {
                sql += " '不是最大顺序号',";
            }
            sql += "'" + 工票码 + "','"+ 不良原因 + "');";

            //long 报工id = pub.ExcuteSql(sql, "工序报工赛值");
            long 报工id =  (long)SqlHelper.SqlHelper.ExecuteScalar(SqlHelper.SqlHelper.U8conn, CommandType.Text, sql);
            if (报工id > 0)
            {
                if (z_报工不良原因List.Count > 0)
                {
                    foreach (var item in z_报工不良原因List)
                    {
                        item.报工id = 报工id;
                    }

                    SqlSugarHelp.scope.Insertable(z_报工不良原因List).ExecuteCommand();
                }

                MessageBox.Show("报工成功", "提示", MessageBoxButtons.OK);
                //塞入看板开工表
                string sql开工 = @"insert into [dbo].[Z_开工]( [员工号], [员工姓名], [机台id],机台名称, [工位], [生产订单号], [订单行号], [工序], [时间], [工票码],报工数量)
                           values('" + cUser_Id + "','" + textBox姓名.Text.Trim() + "','" + "" + "','" + "" + "','" + "" + "','" + this.textBox生产订单号.Text +
                               "','" + this.textBox生产订单行号.Text + "','" + this.textBox工序名称.Text + "'," + "getdate()" + ",'" + 工票码 + "','" + 本次报工数量 + "')";
                pub.ExcuteSql(sql开工, "看板赛值");

                //刷新派工表
                //判断已报数量+本次报工数量是否等于派工数量
                string sqlZ_派工 = "update Z_派工 set 完工数量 = (select sum(isnull(报工数量,0)) from Z_baogong where 工票码 = '" + 工票码 + "') where 工票码 = '" + 工票码 + "';";
                sqlZ_派工 += "update  Z_派工 set 状态 = '完工' where 完工数量 >= 派工数量 and 工票码 = '" + 工票码 + "';";
                sqlZ_派工 += "update  Z_派工 set 状态 = '在产' where 完工数量 < 派工数量 and 工票码 = '" + 工票码 + "';";
                int r1 = SqlHelper.SqlHelper.ExecuteNonQuery(sqlZ_派工);
                //关闭开工
                sql = $"update Z_开工 set 状态 = '完工' , 完工时间 = '{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}'where 工票码 = '{this.textBoxTm.Text.Trim()}'";
                int r2 = SqlHelper.SqlHelper.ExecuteNonQuery(sql);

                this.textBox最大可报数量.Text = Get最大可报数量().ToString();
                this.textBox本次报工数量.Text = "";
                this.textBox报工工时.Text = "";
                this.textBox工时单价.Text = "";
                List报工记录();
                ClearAll();
            }
            else
            {
                MessageBox.Show("报工失败", "提示", MessageBoxButtons.OK);
                this.textBox本次报工数量.SelectAll();
                this.textBox本次报工数量.Focus();
            }
            textBoxTm.Text = "";
            textBoxTm.Focus();


        }

        private decimal Get订单总数量()
        {
            decimal 订单数量 = 0;
            string sql = "select isnull(数量,0) from View_生产订单明细 where  生产订单号='" + 生产订单号 + "' and 物料编号='" + 物料编号 + "' ";
            DataTable tb = pub.U8GetTable(sql);
            if (tb.Rows.Count > 0)
            {
                订单数量 = pub.ToDecimal(tb.Rows[0][0].ToString());
                return 订单数量;
            }
            else
            {
                return 0;
            }
        }

        private decimal Get累计报工数()
        {
            decimal 累计报工数 = 0;
            string sql = @"select isnull(sum( 报工数量),0) from Z_baogong
                                    where 工票码 = '" + 工票码 + "' and 报工人员 = '" + pub.LoginUser + "'";
            DataTable tb3 = pub.U8GetTable(sql);
            if (tb3.Rows.Count > 0)
            {
                累计报工数 = pub.ToDecimal(tb3.Rows[0][0].ToString());
                return 累计报工数;
            }
            else
            {
                return 0;
            }

        }

        private string Get最大顺序号()
        {
            string sql;
            sql = "select max(加工顺序) from z_派工 where 订单号='" + 生产订单号 + "' and 订单行号='" + 生产订单行号 + "' ";
            DataTable tb = pub.U8GetTable(sql);
            if (tb.Rows.Count > 0)
            {
                return tb.Rows[0][0].ToString();
            }
            else
            {
                return "0000";
            }
        }
        /// <summary>
        /// 根据生产订单号，生产订单行号，工序编号查工序单价
        /// </summary>
        /// <param name="生产订单号"></param>
        /// <param name="生产订单行号"></param>
        /// <param name="工序编号"></param>
        /// <returns></returns>
        private decimal Get工序单价()
        {
            string sql;
            sql = "select 工序单价 from z_派工 where 订单号='" + 生产订单号 + "' and 订单行号='" + 生产订单行号 
                    + "' and 加工顺序 ='" + 加工顺序 + "' and 工序编号 = '"+ 工序编号 + "'";
            //sql = "select 工序单价 from View_工序明细 where 生产订单号 ='" + 生产订单号 + "' and 生产订单行号='" + 生产订单行号 + "' and 加工顺序 ='" + 加工顺序 + "'";
            DataTable tb = pub.U8GetTable(sql);
            if (tb.Rows.Count > 0)
            {
                return pub.ToDecimal(tb.Rows[0][0].ToString());
            }
            else
            {
                return 0;
            }
        }

        private void checkBoxGongshi_CheckedChanged(object sender, EventArgs e)
        {
            if (this.checkBoxGongshi.Checked)
            {
                ///需要输入领导的用户名和密码
                FormLingdao fm = new FormLingdao();
                if (fm.ShowDialog(this) == DialogResult.OK)
                {
                    this.textBox工时单价.Visible = true;
                }
                else
                {
                    this.checkBoxGongshi.Checked = false;
                    this.textBox工时单价.Visible = false;
                }

            }
            else
            {
                this.textBox工时单价.Visible = false;
            }
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {

                if (this.dataGridView1.Columns[e.ColumnIndex].Name == "C删除")
                {
                    ///必须是没有质检过，和最新的行才能删除
                    ///
                    int 最大id;
                    string sql;
                    int 当前id;
                    当前id = pub.ToNum(this.dataGridView1.Rows[e.RowIndex].Cells["Cid"].Value.ToString());
                    Z_baogong z = SqlSugarHelp.scope.Queryable<Z_baogong>().Where(it => it.id == 当前id).First();
                    sql = "select isnull(max(id),0) from Z_baogong where 生产订单号='" + z.生产订单号 + "' and 生产订单行号='" + z.生产订单行号 + "'";
                    sql += " and 加工顺序 ='" + z.加工顺序 + "'";

                    DataTable tb1 = pub.U8GetTable(sql);
                    if (tb1.Rows.Count > 0)
                    {
                        最大id = pub.ToNum(tb1.Rows[0][0].ToString());
                        if (当前id != 最大id)
                        {
                            MessageBox.Show("只能删除本人最后没有结算的报工行！", "提示", MessageBoxButtons.OK);
                            return;
                        }
                    }

                    //后续工序没有报工记录才能删除
                    sql = "select * from Z_baogong where 生产订单号='" + z.生产订单号 + "' and 生产订单行号='" + z.生产订单行号 + "'";
                    sql += " and 加工顺序 >'" + z.加工顺序 + "'";
                    DataTable tb = pub.U8GetTable(sql);
                    if (tb.Rows.Count > 0)
                    {
                        MessageBox.Show("后续工序已经有报工记录，不能删除！", "提示", MessageBoxButtons.OK);
                        return;
                    }
                    //sql = "select * from Z_zhijian where [baogongid]='" + 当前id + "' ";
                    //DataTable tb2 = pub.U8GetTable(sql);
                    //if (tb2.Rows.Count > 0)
                    //{
                    //    MessageBox.Show("这个报工记录已经被质检过了，需要取消检验才能删除！", "提示", MessageBoxButtons.OK);
                    //    return;
                    //}
                    ///未做计件计时结算才能删除
                    sql = "select * from Z_baogong where [id]='" + 当前id + "' and 是否已经计算 ='已计件计算'";
                    DataTable tb3 = pub.U8GetTable(sql);
                    if (tb3 != null && tb3.Rows.Count > 0)
                    {
                        MessageBox.Show("这个报工记录已经计件计时计算过了，需要取消计算才能删除！", "提示", MessageBoxButtons.OK);
                        return;
                    }

                    sql = "select 物料编号,报工数量 from Z_baogong where [id]='" + 当前id + "' ";
                    DataTable tb4 = pub.U8GetTable(sql);
                    string 物料编号删除 = tb4.Rows[0][0].ToString();
                    string 数量 = tb4.Rows[0][1].ToString();//因为之前出现第一次报工，发现错误要做删除，但是因为这的判断条件是查询入库单的生产订单号和物料，所以导致报的是一样工单一样物料的东西就会删除不了报工记录，所以加上数量。
                    string sql2 = "select * from rdrecord10 join rdrecords10 on rdrecord10.id=rdrecords10.id where rdrecord10.cMPoCode='"
                                    + 生产订单号 + "' and rdrecords10.cinvcode='"
                                    + 物料编号删除 + "' and rdrecords10.iquantity = '" + 数量 + "' ";//后期看一下是不是需要加上数量来查询
                    DataTable tb5 = pub.U8GetTable(sql2);

                    if (tb5.Rows.Count > 0)
                    {
                        MessageBox.Show("这个报工记录已经入库，需要删除产成品入库单才能删除！", "提示", MessageBoxButtons.OK);
                        return;
                    }

                    sql = "delete Z_baogong where id ='" + 当前id + "';delete Z_报工不良原因 where [报工id] = '"+ 当前id + "'";

                    if (pub.ExcuteSql(sql, "删除报工记录") > 0)
                    {
                        string 工票码 = this.dataGridView1.Rows[e.RowIndex].Cells["C工票码"].Value.ToString();
                        //查询这个工票累计报工数量
                        string sql报工数量 = "select isnull( SUM(报工数量),0)报工数量 from Z_baogong where 工票码 = '" + 工票码 + "'";
                        object 累计报工数量obj = SqlHelper.SqlHelper.ExecuteScalar(sql报工数量);
                        decimal 累计报工数量 = 0;
                        if (累计报工数量obj != null)
                        {
                            累计报工数量 = decimal.Parse(累计报工数量obj.ToString());
                        }

                        string update派工 = "update Z_派工 set 完工数量 = " + 累计报工数量 + ",状态 = '在产' where 工票码 = '" + 工票码 + "' ";
                        SqlHelper.SqlHelper.ExecuteNonQuery(update派工);
                        当前id = 0;
                       
                    }
                    List报工记录();
                }
            }
            catch (Exception ex)
            {

            }
        }

        private void FormWgbg_SizeChanged(object sender, EventArgs e)
        {
            //asc.controllInitializeSize(this);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void textBox不合格数量_Enter(object sender, EventArgs e)
        {
            textBox不合格数量.Text = "";
        }

        private void textBox不合格数量_Leave(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(textBox不合格数量.Text) == true)
            {
                textBox不合格数量.Text = "0";
            }
        }
    }
}
